草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - MS VC++ 上直接和复制初始化的不同行为(使用用户定义的转换运算符)

以下代码compilesfine同时使用g++9.1和clang8.0.0(编译标志为-std=c++17-Wall-Wextra-Werror-pedantic-errors),但不适用于MSVC19.22(编译标志为/std:c++17/permissive-):structX{};structBar{Bar()=default;Bar(X){}};structFoo{operatorX()const{returnX{};}operatorBar()const{returnBar{};}};intmain(){Foofoo;[[maybe_unused]]Barb1=foo;//O

c++ - 为什么在将 std::vector 与默认构造函数一起使用时会出现异常行为?

总结我最近看到了一些关于std::vector的问题,出于好奇,我一直在研究它们。我从来没有真正使用过STL,但我知道你可以使用vector来处理对象数组的分配,而且我可以发誓有一种方法可以使用默认构造函数在vector是创建。的确,这个问题Initializingastd::vectorwithdefaultconstructor处理使用复制构造函数和默认值与仅使用默认构造函数初始化vector。但是,由于我一直在VisualStudio2010中使用C++控制台应用程序项目进行一些试验,因此我没有得到与此解释一致的结果。根据对上述问题(givenhere)的回答中的评论之一,如果您

c++ - 可以在全局对象构造函数中进行打印/记录还是未定义的行为?

#includestructA{A(){std::cout根据C++标准,驻留在多个文件中的全局对象初始化顺序是未指定的。即在1个文件中定义的全局对象将按从上到下的顺序调用它们的构造函数。但是,如果有多个这样的文件,那么哪个文件将是倒数第一个,是实现定义的还是未指定的。现在,std::cout和my_a都是全局对象。这意味着上面的代码是一个UB,它是否正确(即初始化失败)?编译器可能足够聪明,可以在移动到其他对象之前先初始化std对象。仍然为了清楚起见,是否有任何完整的证明方法可以对跨多个文件的全局对象执行日志记录? 最佳答案 是的

c++ - 设置插入进行奇怪数量的比较

我无法解释std::set在插入新元素时进行的比较次数。这是一个例子:对于这段代码structA{inti=0;booloperator()(inta,intb){++i;returnas1(a);s1.insert(1);cout输出是03为什么插入第二个元素需要3次比较?o_O 最佳答案 这是使用红黑树实现std::set的副作用,与标准二叉树相比,它最初需要更多的比较。 关于c++-设置插入进行奇怪数量的比较,我们在StackOverflow上找到一个类似的问题:

c++ - 单例,奇怪的重复模板模式和转发构造函数参数

好的,我知道应该避免使用单例,但是很少有真正需要单例的情况。所以我的解决方案使用CRTP(奇怪的重复模式)实现它们,如下所示:#include#includeusingnamespacestd;template//SingletonpolicyclassclassSingleton{protected:Singleton()=default;~Singleton()=default;Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;public:templatestaticT&ge

c++ - 在编译时填充 std::array 和 const_cast 可能的未定义行为

已知std::array::operator[]由于C++14是constexpr,请参见下面的声明:constexprconst_referenceoperator[](size_typepos)const;但是,它也是const限定的。如果您想使用std::array的下标运算符以便在编译时为数组赋值,这会产生影响。例如考虑以下用户文字:templatestructFooLiteral{std::arrayarr;constexprFooLiteral():arr{}{for(inti(0);i如果您尝试声明类型为FooLiteral的constexpr变量,上述代码将无法编译。这

c++ - 奇怪的 "Could not deduce template argument for ' T'"错误

错误在this代码://myutil.htemplateTConditionalInput(LPSTRinputMessage,LPSTRerrorMessage,predicatecondition);//myutil.cpptemplateTConditionalInput(LPSTRinputMessage,LPSTRerrorMessage,Predcondition){Tinputcout>input;while(!condition(input)){cout>input;}returninput;}...//c_main.cppintrow;row=ConditionalI

C++ 模板 friend 奇怪的行为

我在下面的代码中看到一些我无法解释的东西。在VS6、VS9和GCCT2::foo2()下给出错误:“bar”:无法访问类“C1”中声明的protected成员。但是,如果您删除C1::bar(),它会正确编译和运行,即使T2仍在访问protectedC1B:bar(),您会认为这会是同样的问题。请注意,在T2::foo2()中,您可以将'pT1'转换为'T1*',一切都很好,但这仍然不能解释为什么允许C1B::bar(),但C1::bar()不是。templateclassT2;templateclassT1{//templatefriendclassT2;-->thisdoesn't

c++ - c++11 模式下奇怪的 g++ 预处理器行为

我遇到的问题是,当g++在c++11模式下运行时,一些处理器宏没有正确展开。这让我在使用Qt编译程序时遇到麻烦。$g++--versiong++(GCC)4.7.2Copyright(C)2012FreeSoftwareFoundation,Inc.Thisisfreesoftware;seethesourceforcopyingconditions.ThereisNOwarranty;notevenforMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.以下片段暴露了问题:$catfoo.cpp//#include#defineQTOSTRI

c++ - 导致时间旅行的未定义行为

thisarticle的一个例子来自msdn博客让我兴奋不已:它说这个函数:voidunwitting(booldoor_is_open){if(door_is_open){walk_on_in();}else{ring_bell();//waitforthedoortoopenusingthefallbackvaluefallback=value_or_fallback(nullptr);wait_for_door_to_open(fallback);}}可以优化成这个:voidunwitting(booldoor_is_open){walk_on_in();}因为调用value_o